//给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，就反转这 2k 字符中的前 k 个字符。 
//
// 
// 如果剩余字符少于 k 个，则将剩余字符全部反转。 
// 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "abcdefg", k = 2
//输出："bacdfeg"
// 
//
// 示例 2： 
//
// 
//输入：s = "abcd", k = 2
//输出："bacd"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 10⁴ 
// s 仅由小写英文组成 
// 1 <= k <= 10⁴ 
// 
//
// Related Topics 双指针 字符串 👍 483 👎 0


package leetcode.editor.cn;

// [541]反转字符串 II

public class ReverseStringIi_541 {
    public static void main(String[] args) {
        Solution solution = new ReverseStringIi_541().new Solution();
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String reverseStr(String s, int k) {
            if (s == null || s.length() == 0) {
                return s;
            }
            char[] chars = s.toCharArray();
            int n = s.length() / 2 / k;
            int l, r, i;
            for (i = 0; i < n; i++) {
                l = i * 2 * k;
                r = l + k - 1;
                while (l < r) {
                    swap(chars, l, r);
                    l++;
                    r--;
                }
            }
            l = i * 2 * k;
            r = l + k - 1;
            if (l >= s.length()) {
                return new String(chars);
            }
            if (r >= s.length()) {
                r = s.length() - 1;
            }
            while (l < r) {
                swap(chars, l, r);
                l++;
                r--;
            }
            return new String(chars);
        }

        public void swap(char[] s, int i, int j) {
            char t = s[i];
            s[i] = s[j];
            s[j] = t;
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}